#pragma once

#include <optional>
#include <QString>
#include "../nlohmann/json.hpp"

using json = nlohmann::json;

class Data {
public:
    std::optional<long long> dataId;
    std::optional<int> deviceId;
    std::optional<std::string> timestamp;
    std::optional<float> temperature;
    std::optional<float> humidity;
    std::optional<float> light;
    std::optional<float> co2;
    std::optional<float> pressure;

    json toJson() const {
        json j;
        j["dataId"] = dataId ? json(*dataId) : json(nullptr);
        j["deviceId"] = deviceId ? json(*deviceId) : json(nullptr);
        j["timestamp"] = timestamp ? json(*timestamp) : json(nullptr);
        j["temperature"] = temperature ? json(*temperature) : json(nullptr);
        j["humidity"] = humidity ? json(*humidity) : json(nullptr);
        j["light"] = light ? json(*light) : json(nullptr);
        j["co2"] = co2 ? json(*co2) : json(nullptr);
        j["pressure"] = pressure ? json(*pressure) : json(nullptr);
        return j;
    }

    static Data fromJson(const json &j) {
        Data d;
        if (j.contains("dataId") && !j["dataId"].is_null()) d.dataId = j["dataId"].get<long long>();
        if (j.contains("deviceId") && !j["deviceId"].is_null()) d.deviceId = j["deviceId"].get<int>();
        if (j.contains("timestamp") && !j["timestamp"].is_null()) d.timestamp = j["timestamp"].get<std::string>();
        if (j.contains("temperature") && !j["temperature"].is_null()) d.temperature = j["temperature"].get<float>();
        if (j.contains("humidity") && !j["humidity"].is_null()) d.humidity = j["humidity"].get<float>();
        if (j.contains("light") && !j["light"].is_null()) d.light = j["light"].get<float>();
        if (j.contains("co2") && !j["co2"].is_null()) d.co2 = j["co2"].get<float>();
        if (j.contains("pressure") && !j["pressure"].is_null()) d.pressure = j["pressure"].get<float>();
        return d;
    }
};
